/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package colordrips;

import java.util.ArrayList;
import javax.swing.ImageIcon;

/**
 *
 * @author SimaoItalo
 */
public class GameLogic {
    
    // Verifica se ainda é possível realizar uma jogada.
    // Retorna TRUE caso ainda haja jogadas possíveis.
    //public static boolean hasPossibleMoves(ArrayList<ArrayList<Block>> matrixBlocks){
        
    //}
    
    // Verifica se o bloco selecionado é um movimento válido para jogada.
    // Retorna TRUE caso seja.
    public static boolean isAPossibleMove(ArrayList<ArrayList<Block>> matrixBlocks, Block selectedBlock){
        
        if((matrixBlocks.get(selectedBlock.getiPosition()+1).get(selectedBlock.getjPosition()).hasSameColor(selectedBlock))
        || (matrixBlocks.get(selectedBlock.getiPosition()-1).get(selectedBlock.getjPosition()).hasSameColor(selectedBlock))
        || (matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()+1).hasSameColor(selectedBlock))
        || (matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()-1).hasSameColor(selectedBlock))){
            return true;
        } else {
            return false;
        }
        
    }
    
    public static void removeBlocks(ArrayList<ArrayList<Block>> matrixBlocks, Block selectedBlock){
        if(matrixBlocks.get(selectedBlock.getiPosition()+1).get(selectedBlock.getjPosition()).hasSameColor(selectedBlock)){
            Block block = matrixBlocks.get(selectedBlock.getiPosition()+1).get(selectedBlock.getjPosition());
            removeThisBlock(block, matrixBlocks);
        }
        if(matrixBlocks.get(selectedBlock.getiPosition()-1).get(selectedBlock.getjPosition()).hasSameColor(selectedBlock)){
            Block block = matrixBlocks.get(selectedBlock.getiPosition()-1).get(selectedBlock.getjPosition());
            removeThisBlock(block, matrixBlocks);
        }
        if(matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()+1).hasSameColor(selectedBlock)){
            Block block = matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()+1);
            removeThisBlock(block, matrixBlocks);
        }
        if(matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()-1).hasSameColor(selectedBlock)){
            Block block = matrixBlocks.get(selectedBlock.getiPosition()).get(selectedBlock.getjPosition()-1);
            removeThisBlock(block, matrixBlocks);
        }
    }
    
    private static void removeThisBlock(Block block, ArrayList<ArrayList<Block>> matrixBlocks){
        matrixBlocks.get(block.getiPosition()).get(block.getjPosition()).clearBlock();
        matrixBlocks.get(block.getiPosition()).get(block.getjPosition()).setImage("");
    }
    
    // Tem como função verificar o número de peças que estão atualmente sendo
    // mostradas no campo de jogo.
    public static void checkNumberOfBlocks(){
        
    }
    
    // Faz o ajuste de linhas da matriz.
    public static void adjustLines(ArrayList<ArrayList<Block>> matrixBlocks){
        //procurar blocos vazios, que contém um bloco cheio acima, e então trocá-los
        for(int i = 1; i < 7; i++){
            for(int j = 1; j < 11; j++){
                if(matrixBlocks.get(i).get(j).isEmpty()){
                    if(!matrixBlocks.get(i-1).get(j).isEmpty()){
                        Block temp = matrixBlocks.get(i).get(j);
                        matrixBlocks.get(i).set(j, matrixBlocks.get(i-1).get(j));
                        matrixBlocks.get(i-1).set(j, temp);
                        adjustLines(matrixBlocks);
                    }
                }
            }
        }
    }
    
    // Faz o ajuste de colunas da matriz.
    public static void adjustColumns(ArrayList<ArrayList<Block>> matrixBlocks){
        for(int i = 1; i < 7; i++){
            for(int j = 1; j < 11; j++){
                if(matrixBlocks.get(i).get(j).isEmpty()){
                    if(!matrixBlocks.get(i).get(j+1).isEmpty()){
                        Block temp = matrixBlocks.get(i).get(j);
                        matrixBlocks.get(i).set(j, matrixBlocks.get(i).get(j+1));
                        matrixBlocks.get(i).set(j+1, temp);
                        adjustColumns(matrixBlocks);
                    }
                }
            }
        }
    }
    
}
